package main

import "fmt"

func main() {
	// m := 'a'   // int32
	// n := m + 1 // int32+int
	// n := m + int32(1)
	// fmt.Println(n)

	// var a = 3.14 // float64
	// fmt.Println(a)

	// var a int8 = -1
	// var b uint8 = uint8(a)
	// fmt.Println(a, b)

	// x := 'a'
	// y := 1
	// z := x + int32(y)
	// fmt.Printf("%T %[1]d \n", z)

	// type MyByte uint8 // 没有等号，我基于你，本质上就是 uint8，go 中认为不是同一个类型
	// // MyByte 就是基于 uint8 的新类型
	// // 新类型可以定义很多方法
	// // type byte = uint8 = 等于，等价，别名
	// var a byte = 'A' // byte 就是 uint8
	// var b uint8 = 0x20
	// fmt.Println(a + b)
	// var c MyByte = 0x20
	// fmt.Println(a + byte(c))

	// 字符串转换

	// fmt.Println(string(97))
	// fmt.Println(strconv.Itoa(97), strconv.Itoa(27979))
	// fmt.Println(fmt.Sprintf("%#x", 27979))

	// s1 := "97"
	// if v, err := strconv.Atoi(s1); err != nil {
	// 	panic(err)
	// } else {
	// 	fmt.Printf("%T %[1]d\n", v)
	// }
	// v, err := strconv.ParseInt(s1, 16, 0)
	// if err != nil {
	// 	panic(err)
	// }
	// fmt.Printf("%T %[1]v\n", v)

	// fmt.Println(strconv.ParseBool("1"))
	// fmt.Println(strconv.ParseBool("TRUE"))
	// fmt.Println(strconv.ParseBool("FALSE"))
	// fmt.Println(strconv.ParseFloat("12.6", 64))

	// fmt.Println("~~~~~~~~~~~~~~~~~~~~~~~")

	s1 := "abcd"
	s2 := "测试"
	fmt.Println(len(s1), len(s2))

	// string => []byte
	fmt.Println([]byte(s1))
	fmt.Println([]rune(s1)) // 16个字节，四个元素。每个元素是 rune，四个字节，总共 16个字节
	// fmt.Println([]byte(s2))
	fmt.Println([]byte(s2))
	fmt.Println([]rune(s2))

	// []byte => string
	fmt.Println(string([]byte{97, 0x41, 0x30}))                   // "aA0"
	fmt.Println(string([]rune{97, 0x41, 0x30, 27979}))            // "aA0测"
	fmt.Println(string([]byte{97, 0x41, 0x30, 0xe6, 0xb5, 0x8b})) // "aA0测"

}
